package de.fhffm.gui;

import java.awt.BorderLayout;
import java.awt.GridLayout;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.regex.Pattern;

import javax.persistence.EntityManager;
import javax.persistence.EntityManagerFactory;
import javax.persistence.Persistence;
import javax.persistence.Query;
import javax.swing.JButton;
import javax.swing.JComboBox;
import javax.swing.JFormattedTextField;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JOptionPane;
import javax.swing.JPanel;
import javax.swing.JTextField;
import javax.swing.text.MaskFormatter;

import de.fhffm.tables.Aussaat;
import de.fhffm.tables.Duenger;
import de.fhffm.tables.Pflanze;

public class NeueAussaatFenster implements ActionListener {

	private JButton btnOk = new JButton("OK");
	private JButton btnAbbrechen = new JButton("Abbrechen");
	private JButton btnPflanze = new JButton("+ Pflanze");
	private JButton btnDuenger = new JButton("+ Duenger");
	
	private JLabel labelPflanze = new JLabel("Pflanze");
	private JLabel labelDuenger = new JLabel("Duenger");
	private JLabel labelOrt = new JLabel("Pflanz Ort");
	private JLabel labelDuengerMenge = new JLabel("DuengerMenge");
	private JLabel labelDatum= new JLabel("Datum");
	
	private JTextField txtPflanze = new JTextField(8);
	private JTextField txtDuenger = new JTextField(8);
	private JTextField txtDuengerMenge = new JTextField(8);
	
	private JFormattedTextField txtDatum ;
	
	private MaskFormatter datumFormat= null;
	
	private SimpleDateFormat simpleDateFormat = new SimpleDateFormat("dd.MM.yyyy");
	
	private Date aktuellesDatum = new Date();

	private JFrame neueAussaatFrame = new JFrame();
	
	private JPanel eingabePanel = new JPanel(new GridLayout(5,2));
	private JPanel buttonPanel = new JPanel();
	
	private String pflanze = null;
	private String duenger = null;
	private String ort = null;
	private String datum;
	private String duengerMengeString = null;
	private String[] orte = {"Topf klein","Topf mittel","Topf groß","Feld","Beet"};
	
	@SuppressWarnings({ "rawtypes", "unchecked" })
	private JComboBox ortListe = new JComboBox(orte);

	private double duengerMenge = 0;
	
	StringBuilder sb = new StringBuilder();
	
	NeueAussaatFenster() {

		neueAussaatFrame.setTitle("Neue Aussaat");	
		neueAussaatFrame.setSize(400,500);
		neueAussaatFrame.setLocationRelativeTo(null);
		neueAussaatFrame.setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE);
		neueAussaatFrame.setVisible(true);
		neueAussaatFrame.setResizable(true);
		neueAussaatFrame.setLayout(new BorderLayout());

		eingabePanel.add(labelPflanze);
		eingabePanel.add(txtPflanze);
		txtPflanze.setEnabled(false); // Textfeld kann nicht beschrieben werden
		eingabePanel.add(labelDuenger);
		eingabePanel.add(txtDuenger);
		txtDuenger.setEnabled(false);
		eingabePanel.add(labelOrt);
		eingabePanel.add(ortListe);
		eingabePanel.add(labelDuengerMenge);
		eingabePanel.add(txtDuengerMenge);
		txtDuengerMenge.setToolTipText("Menge des eingesetzten Düngers in Kilogramm");
		eingabePanel.add(labelDatum);
		setzeDatumTxtFeld();

		
		buttonPanel.add(btnOk);
		btnOk.addActionListener(this);
		buttonPanel.add(btnAbbrechen);
		btnAbbrechen.addActionListener(this);
		buttonPanel.add(btnPflanze);
		btnPflanze.addActionListener(this);
		buttonPanel.add(btnDuenger);
		btnDuenger.addActionListener(this);
		
		
		neueAussaatFrame.add(eingabePanel,BorderLayout.CENTER);
		neueAussaatFrame.add(buttonPanel,BorderLayout.SOUTH);
		
	}

	private void setzeDatumTxtFeld() {
		
		try {
			datumFormat = new MaskFormatter("##.##.####");
		} catch (ParseException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
		
		txtDatum = new JFormattedTextField(datumFormat);
		txtDatum.setText(simpleDateFormat.format(aktuellesDatum));
		eingabePanel.add(txtDatum);
		
	}

	@Override
	public void actionPerformed(ActionEvent e) {
		
		Object obj = e.getSource();
		
		if(obj == btnPflanze){
			new PflanzenTabelle(txtPflanze);
		}
		
		if(obj == btnDuenger){
			new DuengerTabelle(txtDuenger);
		}
		
		if(obj == btnOk){
			
			if(ueberpruefeEingabe()){
				fuegeAussaatEin();
				einfügenEnde();
				
			}else{
				System.out.println("Eingabe Fehler");
			}
		}
		
		if(obj == btnAbbrechen){
			neueAussaatFrame.dispose();
		}
	}

	private void einfügenEnde() {
		
		Object[] options = {"Fertig!","Neue Aussaat!"};
		int selected = JOptionPane.showOptionDialog(null,"Aussaat hinzugefügt!", "Hinzufügen Erfolgreich", JOptionPane.YES_NO_OPTION,
					   JOptionPane.QUESTION_MESSAGE, null , options ,options[1]);
		
		switch(selected){
		case 0:
			neueAussaatFrame.dispose();
			break;
		case 1:
			loescheTextFelder();
			break;
		}
		
	}
	
	private void loescheTextFelder() {
		
		txtDatum.setText(null);
		txtDuenger.setText(null);
		txtDuengerMenge.setText(null);
		txtPflanze.setText(null);
		ortListe.setSelectedIndex(0);
		
	}
	
	private boolean ueberpruefeEingabe() {
		
		boolean pruefe = false;
		try {
			ueberpruefeDatum();
			pruefe = hohleEingabe();
		} catch (InputException e) {
			System.out.println("Eingabe Fehlt");
		} catch (NumberFormatException n){
			System.out.println("Bitte Zahlen eingeben!");
			JOptionPane.showMessageDialog(null,"Bitte für Datum und Dünger Menge Zahlen eingeben.","Fehler",JOptionPane.ERROR_MESSAGE);
		}
		return pruefe;
	}
	
	private boolean hohleEingabe() throws InputException,NumberFormatException {
		
		pflanze = txtPflanze.getText();
		duenger = txtDuenger.getText();
		ort = (String) ortListe.getSelectedItem();
		duengerMenge = Double.parseDouble(txtDuengerMenge.getText());
		sb.append(duengerMenge).append(" Kilogramm");
		duengerMengeString = sb.toString();
		sb.setLength(0);
		datum = txtDatum.getText();

		if(isEingabeLeer()){
			
			throw new InputException("Eine oder mehrere Eingaben fehlen, bitte keine negativen Zahlen eingeben!");
		
		}else{

			return true;

		}

	}
	
	private void ueberpruefeDatum() throws InputException {
        
		/*Das Aktuelle Datum wird in einen String mit dem format dd.mm.yyyy umgewandelt.
		Dan wird das aktuelle Datum wieder als Date gespeichert nur mit dem vorher definierten format
		so kann das aktuelle Datum mit dem eingegebenen Datum verglichen werden */
		datum = txtDatum.getText();
		Date eingegebenesDatum = null;				
		String aktuellesDatumString = simpleDateFormat.format(aktuellesDatum);
		String[] teilString = datum.split(Pattern.quote(".")); // Das eingegebene Datum wird gesplittet
		 
		try {
			
			 eingegebenesDatum = simpleDateFormat.parse(datum);
			 aktuellesDatum = simpleDateFormat.parse(aktuellesDatumString);
			
		} catch (ParseException e) {
			e.printStackTrace();
		}
		
		if(eingegebenesDatum.after(aktuellesDatum)){
			throw new InputException("Das eingegebene Datum darf nicht nach dem aktuellem Datum liegen!");
			
		// Eingegebenes Datum ist ungültig wenn kein Tag, Monat oder Jahr angegeben wird bsp.: 00.00.0000	
		// um dies zu überprüfen wird der vorher gesplittete String genutzt
		}else if((teilString[0]).equals("00") || (teilString[1].equals("00") || teilString[2].equals("0000") || teilString[2].substring(0, 1).equals("0")) ){
		    throw new InputException("Das Datum muss im format tt.mm.yyyy eingegeben werden und darf nicht 0 sein");
		
		}else if(eingegebenesDatum.equals(aktuellesDatum)){
			System.out.println("Alles ok");
		}
		
	}


	private boolean isEingabeLeer() {
		
		if(pflanze.length() == 0 || duenger.length() == 0 || ort.length() == 0 || duengerMenge <= 0.0 ) {	
			
			return true;
		}else{
			return false;
		}
	}

	private void fuegeAussaatEin() {
		
		System.out.println("Aussaat wird eingefügt");
		EntityManagerFactory factory;
		factory = Persistence.createEntityManagerFactory("test");
		EntityManager em = factory.createEntityManager();
		em.getTransaction().begin();
		
		Query q = em.createQuery("SELECT p FROM Pflanze p WHERE p.sorte = :name");
				  q.setParameter("name", pflanze);
				  
		Pflanze pflanz = (Pflanze) q.getSingleResult();
		
		q =  em.createQuery("SELECT d FROM Duenger d WHERE d.duengerMarke = :name");
		  	 q.setParameter("name", duenger);
		
		Duenger dueng = (Duenger) q.getSingleResult();
		
		Aussaat aussaat = new Aussaat();

		aussaat.setPflanze(pflanz);
		aussaat.setDuenger(dueng);
		pflanz.getAussaat().add(aussaat);
		dueng.getAussaat().add(aussaat);
		
		aussaat.setPflanzOrt(ort);
		aussaat.setDuengerMenge(duengerMengeString);
		aussaat.setAussaatDatum(datum);
		
		em.persist(pflanz);
		em.persist(aussaat);
		em.persist(dueng);
		em.getTransaction().commit();
		em.close();
		
		
	}
}
